package com.springboot.file.constant;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

/**
 * 分页结果类
 * <p>
 * 用于统一返回分页查询结果，包含分页信息和数据。
 * 继承自Result类，提供了分页相关的功能。
 * </p>
 *
 * @param <T> 返回数据的类型，可能为 {@code null}
 * @author liuc
 * @since 1.0
 */
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "分页结果")
public class IPageResult<T> extends Result<T> {

    /**
     * 当前页码
     */
    @Schema(description = "当前页码")
    private long pageNo;

    /**
     * 每页记录数
     */
    @Schema(description = "每页记录数")
    private long pageSize;

    /**
     * 总页数
     */
    @Schema(description = "总页数")
    private long totalPage;

    /**
     * 总记录数
     */
    @Schema(description = "总记录数")
    private long totalRows;

    /**
     * 使用MyBatis-Plus分页对象构造分页结果
     *
     * @param page MyBatis-Plus分页对象，包含分页信息和数据，可能为 {@code null}
     */
//    public IPageResult(PagE<T> page) {
//        super(ResultCode.SUCCESS);
//        this.pageNo = page.getCurrent();
//        this.pageSize = page.getSize();
//        this.totalPage = page.getPages();
//        this.totalRows = page.getTotal();
//        super.setData((T) page.getRecords());
//    }

    /**
     * 使用已有的分页结果对象构造新的分页结果
     *
     * @param page 已有的分页结果对象，可能为 {@code null}
     */
    public IPageResult(IPageResult<T> page) {
        super(ResultCode.SUCCESS);
        this.pageNo = page.getPageNo();
        this.pageSize = page.getPageSize();
        this.totalPage = page.getTotalPage();
        this.totalRows = page.getTotalRows();
        super.setData(page.getData());
    }

    /**
     * 使用分页参数和数据构造分页结果
     *
     * @param pageNo 当前页码
     * @param pageSize 每页记录数
     * @param totalPage 总页数
     * @param totalRows 总记录数
     * @param data 返回数据，可能为 {@code null}
     */
    public IPageResult(long pageNo, long pageSize, long totalPage, long totalRows, T data) {
        super(ResultCode.SUCCESS);
        this.pageNo = pageNo;
        this.pageSize = pageSize;
        this.totalPage = totalPage;
        this.totalRows = totalRows;
        super.setData(data);
    }
}